package com.hifar.test.api.validator;

import com.hifar.test.api.model.DataRequest;
import com.hifar.test.api.model.DataItem;
import com.hifar.test.api.model.SyncDeptInfo;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 数据验证器
 * 用于验证接收到的数据格式和内容
 */
@Component
public class DataValidator {

    /**
     * 验证数据请求
     *
     * @param dataRequest 数据请求
     * @return 验证结果
     */
    public ValidationResult validateDataRequest(DataRequest dataRequest) {
        List<String> errors = new ArrayList<>();

        // 验证基本字段
        if (dataRequest == null) {
            errors.add("数据请求不能为空");
            return new ValidationResult(false, errors);
        }

        if (dataRequest.getModelCode() == null || dataRequest.getModelCode().trim().isEmpty()) {
            errors.add("模型代码不能为空");
        }

        if (dataRequest.getDataStatus() == null) {
            errors.add("数据状态不能为空");
        }

        if (dataRequest.getData() == null || dataRequest.getData().isEmpty()) {
            errors.add("数据列表不能为空");
        } else {
            // 验证数据项
            for (int i = 0; i < dataRequest.getData().size(); i++) {
                DataItem dataItem = dataRequest.getData().get(i).getBusinessData();
                if (dataItem == null) {
                    errors.add("数据项[" + i + "]不能为空");
                } else {
                    ValidationResult itemResult = validateDataItem(dataItem, i);
                    if (!itemResult.isValid()) {
                        errors.addAll(itemResult.getErrors());
                    }
                }
            }
        }

        return new ValidationResult(errors.isEmpty(), errors);
    }

    /**
     * 验证数据项
     *
     * @param dataItem 数据项
     * @param index 索引
     * @return 验证结果
     */
    public ValidationResult validateDataItem(DataItem dataItem, int index) {
        List<String> errors = new ArrayList<>();

        if (dataItem.getOrganizationInfo() == null) {
            errors.add("数据项[" + index + "]的组织信息不能为空");
        } else {
            ValidationResult orgResult = validateOrganizationInfo(dataItem.getOrganizationInfo(), index);
            if (!orgResult.isValid()) {
                errors.addAll(orgResult.getErrors());
            }
        }

        return new ValidationResult(errors.isEmpty(), errors);
    }

    /**
     * 验证组织信息
     *
     * @param orgInfo 组织信息
     * @param index 索引
     * @return 验证结果
     */
    public ValidationResult validateOrganizationInfo(SyncDeptInfo orgInfo, int index) {
        List<String> errors = new ArrayList<>();

        // 验证必填字段
        if (orgInfo.getId() == null || orgInfo.getId().trim().isEmpty()) {
            errors.add("数据项[" + index + "]的组织ID不能为空");
        }

        if (orgInfo.getDeptName() == null || orgInfo.getDeptName().trim().isEmpty()) {
            errors.add("数据项[" + index + "]的部门名称不能为空");
        }

        // 验证字段格式
        if (orgInfo.getId() != null && !orgInfo.getId().matches("^[0-9]+$")) {
            errors.add("数据项[" + index + "]的组织ID格式错误，应为数字");
        }

        if (orgInfo.getLayer() != null && !orgInfo.getLayer().matches("^[0-9]+$")) {
            errors.add("数据项[" + index + "]的组织层级格式错误，应为数字");
        } else if (orgInfo.getLayer() != null) {
            try {
                int layer = Integer.parseInt(orgInfo.getLayer());
                if (layer < 1 || layer > 10) {
                    errors.add("数据项[" + index + "]的组织层级必须在1-10之间");
                }
            } catch (NumberFormatException e) {
                errors.add("数据项[" + index + "]的组织层级格式错误");
            }
        }

        if (orgInfo.getSecretLevel() != null) {
            if (orgInfo.getSecretLevel() < 1 || orgInfo.getSecretLevel() > 5) {
                errors.add("数据项[" + index + "]的密级必须在1-5之间");
            }
        }

        // 验证日期格式
        if (orgInfo.getCreateDate() != null && !orgInfo.getCreateDate().trim().isEmpty()) {
            if (!isValidDate(orgInfo.getCreateDate())) {
                errors.add("数据项[" + index + "]的创建日期格式错误，应为yyyy-MM-dd");
            }
        }

        if (orgInfo.getUpdateDate() != null && !orgInfo.getUpdateDate().trim().isEmpty()) {
            if (!isValidDate(orgInfo.getUpdateDate())) {
                errors.add("数据项[" + index + "]的更新日期格式错误，应为yyyy-MM-dd");
            }
        }

        return new ValidationResult(errors.isEmpty(), errors);
    }

    /**
     * 验证日期格式
     *
     * @param date 日期字符串
     * @return 是否有效
     */
    private boolean isValidDate(String date) {
        if (date == null || date.trim().isEmpty()) {
            return true; // 空值认为是有效的
        }

        try {
            // 简单的日期格式验证 yyyy-MM-dd
            if (!date.matches("^\\d{4}-\\d{2}-\\d{2}$")) {
                return false;
            }

            String[] parts = date.split("-");
            int year = Integer.parseInt(parts[0]);
            int month = Integer.parseInt(parts[1]);
            int day = Integer.parseInt(parts[2]);

            if (year < 1900 || year > 2100) {
                return false;
            }

            if (month < 1 || month > 12) {
                return false;
            }

            if (day < 1 || day > 31) {
                return false;
            }

            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 验证结果类
     */
    public static class ValidationResult {
        private final boolean valid;
        private final List<String> errors;

        public ValidationResult(boolean valid, List<String> errors) {
            this.valid = valid;
            this.errors = errors != null ? errors : new ArrayList<>();
        }

        public boolean isValid() {
            return valid;
        }

        public List<String> getErrors() {
            return errors;
        }

        public String getErrorMessage() {
            return String.join("; ", errors);
        }

        @Override
        public String toString() {
            return "ValidationResult{" +
                    "valid=" + valid +
                    ", errors=" + errors +
                    '}';
        }
    }
}
